home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / gfaxpert.lzh / GFAXPERT.LIB / MIDI.LST < prev    next >
Encoding:
File List  |  1986-10-19  |  7.1 KB  |  275 lines

  1. ' ****************
  2. ' *** MIDI.LST ***
  3. ' ****************
  4. '
  5. DEFWRD "a-z"
  6. '
  7. > PROCEDURE clear.midi.buffer
  8.   ' *** clear MIDI-buffer
  9.   LOCAL buffer$
  10.   buffer$=INPMID$
  11. RETURN
  12. ' **********
  13. '
  14. > PROCEDURE change.midi.buffer(size%)
  15.   ' *** change size of MIDI-buffer (default 128 bytes)
  16.   ' *** global :  MIDI.BUFFER.ADR%
  17.   LOCAL ptr%
  18.   ptr%=XBIOS(14,2)
  19.   IF midi.buffer.adr%=0
  20.     midi.buffer.adr%=LPEEK(ptr%)  ! address of original buffer
  21.   ENDIF
  22.   ERASE buffer|()
  23.   DIM buffer|(size%-1)
  24.   LPOKE ptr%,VARPTR(buffer|(0))   ! start-address new buffer
  25.   DPOKE ptr%+4,size%              ! size
  26.   DPOKE ptr%+6,0                  ! buffer-head
  27.   DPOKE ptr%+8,0                  ! buffer-tail
  28.   DPOKE ptr%+10,0                 ! low mark (not used)
  29.   DPOKE ptr%+12,size%-1           ! high mark (not used)
  30. RETURN
  31. ' ***
  32. > PROCEDURE restore.midi.buffer
  33.   ' *** restore default MIDI-buffer (128 bytes)
  34.   LOCAL adres%,m$,k
  35.   IF midi.buffer.adr%<>0
  36.     adres%=XBIOS(14,2)
  37.     LPOKE adres%,midi.buffer.adr%     ! start-address default buffer
  38.     DPOKE adres%+4,128                ! size
  39.     DPOKE adres%+6,0                  ! buffer-head
  40.     DPOKE adres%+8,0                  ! buffer-tail
  41.     DPOKE adres%+10,0                 ! low mark (not used)
  42.     DPOKE adres%+12,127               ! high mark (not used)
  43.   ELSE
  44.     m$="default MIDI-buffer|(size 128 bytes) is|still active, so|"
  45.     m$=m$+"Restore is superfluous"
  46.     ALERT 3,m$,1," OK ",k
  47.   ENDIF
  48. RETURN
  49. ' **********
  50. '
  51. > PROCEDURE all.midi.off
  52.   ' *** switch everything off on all channels
  53.   LOCAL channel
  54.   FOR channel=0 TO 15
  55.     OUT 3,&HB0+channel,123,0      ! all notes off
  56.     OUT 3,&HB0+channel,64,0       ! sustain off
  57.     OUT 3,&HB0+channel,1,0        ! modulation off
  58.     OUT 3,&HE0+channel,0,0        ! pitch bend off
  59.   NEXT channel
  60. RETURN
  61. ' **********
  62. '
  63. > PROCEDURE midi.off(channel)
  64.   ' *** switch everything off on this channel (1-16)
  65.   OUT 3,&HB0+channel-1,123,0      ! all notes off
  66.   OUT 3,&HB0+channel-1,64,0       ! sustain off
  67.   OUT 3,&HB0+channel-1,1,0        ! modulation off
  68.   OUT 3,&HE0+channel-1,0,0        ! pitch bend off
  69. RETURN
  70. ' **********
  71. '
  72. > PROCEDURE play.midi(VAR midi.byte|(),midi.time%())
  73.   ' *** play music (see also Procedure Record.midi)
  74.   ' *** byte-array for notes and integer-array for time
  75.   ' *** uses Procedure All.midi.off
  76.   LOCAL m$,k,i%,t%,time%
  77.   m$="record of "+STR$(INT(midi.time%(last.midi.byte%)/200))+" seconds| |"
  78.   m$=m$+"(stop by pressing space)"
  79.   ALERT 3,m$,1,"PLAY",k
  80.   REPEAT
  81.   UNTIL INKEY$=""
  82.   i%=1
  83.   t%=TIMER
  84.   REPEAT
  85.     time%=SUB(TIMER,t%)
  86.     IF midi.time%(i%)<=time%
  87.       OUT 3,midi.byte|(i%)
  88.       INC i%
  89.     ENDIF
  90.   UNTIL i%=last.midi.byte% OR INKEY$=" "
  91.   @all.midi.off
  92. RETURN
  93. ' **********
  94. '
  95. > PROCEDURE record.midi(VAR midi.byte|(),midi.time%())
  96.   ' *** record music
  97.   ' *** byte-array for notes and integer-array for time
  98.   ' *** active sensing message ignored
  99.   ' *** uses Procedure All.midi.off
  100.   ' *** global :  LAST.MIDI.BYTE%
  101.   LOCAL last%,buffer$,i%,t%,time%,byte|,delay%,j%,m$,k
  102.   ARRAYFILL midi.byte|(),0
  103.   ARRAYFILL midi.time%(),0
  104.   last%=DIM?(midi.byte|())-1
  105.   m$=STR$(last%)+" bytes available ;| |stop recording|"
  106.   m$=m$+"by pressing space"
  107.   ALERT 3,m$,1,"RECORD",k
  108.   REPEAT
  109.   UNTIL INKEY$=""
  110.   buffer$=INPMID$         ! clear MIDI-buffer
  111.   i%=1
  112.   t%=TIMER
  113.   REPEAT
  114.     IF INP?(3)
  115.       byte|=INP(3)
  116.       IF byte|<>254
  117.         time%=SUB(TIMER,t%)
  118.         midi.byte|(i%)=byte|
  119.         midi.time%(i%)=time%
  120.         INC i%
  121.       ENDIF
  122.     ENDIF
  123.   UNTIL i%=last% OR INKEY$=" "
  124.   last.midi.byte%=i%-1
  125.   @all.midi.off
  126.   delay%=midi.time%(1)               ! subtract time for first note
  127.   FOR j%=1 TO i%
  128.     SUB midi.time%(j%),delay%
  129.   NEXT j%
  130.   m$="|"+STR$(i%)+" bytes recorded"
  131.   ALERT 3,m$,1," OK ",k
  132. RETURN
  133. ' **********
  134. '
  135. > PROCEDURE midi.monitor
  136.   ' *** simple monitor
  137.   LOCAL m$,k,byte|,byte$,hex$,bin$,buffer$,key$
  138.   byte$=SPACE$(3)
  139.   hex$=SPACE$(2)
  140.   bin$=SPACE$(8)
  141.   m$="all incoming bytes|(except 254) are|printed on screen ;|"
  142.   m$=m$+"stop by pressing space"
  143.   ALERT 1,m$,1,"START",k
  144.   m$="press|<Return>|for CLS"
  145.   ALERT 1,m$,1," OK ",k
  146.   REPEAT
  147.   UNTIL INKEY$=""
  148.   buffer$=INPMID$      ! clear MIDI-buffer
  149.   CLS
  150.   PRINT TAB(10);"dec";TAB(20);"hex";TAB(30);"binary"
  151.   REPEAT
  152.     REPEAT
  153.       key$=INKEY$
  154.       IF INP?(3)
  155.         byte|=INP(3)
  156.         IF byte|<>254
  157.           IF TIMER-t%>200
  158.             PRINT
  159.           ENDIF
  160.           t%=TIMER
  161.           RSET byte$=STR$(byte|)
  162.           RSET hex$=HEX$(byte|)
  163.           RSET bin$=BIN$(byte|)
  164.           PRINT TAB(10);byte$;TAB(20);hex$;TAB(30);bin$
  165.         ENDIF
  166.       ENDIF
  167.     UNTIL key$=" " OR key$=CHR$(13)
  168.     IF key$=CHR$(13)
  169.       CLS
  170.     ENDIF
  171.   UNTIL key$=" "
  172.   @all.midi.off
  173.   REPEAT
  174.   UNTIL INKEY$=""
  175.   PRINT " (press any key)"
  176.   ~INP(2)
  177. RETURN
  178. ' **********
  179. '
  180. ' ------------------------------------------------------------------------------
  181. '                     *** MIDI control commands ***
  182. '
  183. ' *** all Procedures : channel 1-16, other parameters 0-127
  184. '
  185. > PROCEDURE note.off(channel,note,velocity)
  186.   OUT 3,&H80+channel-1,note,velocity
  187. RETURN
  188. ' ***
  189. > PROCEDURE note.on(channel,note,velocity)
  190.   ' *** note off : velocity=0
  191.   OUT 3,&H90+channel-1,note,velocity
  192. RETURN
  193. ' ***
  194. > PROCEDURE key.pressure(channel,note,pressure)
  195.   OUT 3,&HA0+channel-1,note,pressure
  196. RETURN
  197. ' ***
  198. > PROCEDURE control.change(channel,number,value)
  199.   OUT 3,&HB0+channel-1,number,value
  200. RETURN
  201. ' ***
  202. > PROCEDURE program.change(channel,number)
  203.   OUT 3,&HC0+channel-1,number
  204. RETURN
  205. ' ***
  206. > PROCEDURE channel.pressure(channel,pressure)
  207.   OUT 3,&HD0+channel-1,pressure
  208. RETURN
  209. ' ***
  210. > PROCEDURE pitch.bend(channel,bend)
  211.   ' *** bend 0-255
  212.   LOCAL byte1|,byte2|
  213.   IF BTST(bend,0)
  214.     byte1|=64
  215.   ELSE
  216.     byte1|=0
  217.   ENDIF
  218.   byte2|=SHR|(BYTE(bend),1)
  219.   OUT 3,&HE0+channel-1,byte1|,byte2|
  220. RETURN
  221. ' ------------------------------------------------------------------------------
  222. '
  223. ' ------------------------------------------------------------------------------
  224. '                  *** specific MIDI control change events ***
  225. '
  226. > PROCEDURE modulate(channel,modulate)
  227.   OUT 3,&HB0+channel-1,1,modulate
  228. RETURN
  229. ' ***
  230. > PROCEDURE data.entry(channel,data)
  231.   OUT 3,&HB0+channel-1,6,data
  232. RETURN
  233. ' ***
  234. > PROCEDURE hold(channel,switch!)
  235.   LOCAL hold|
  236.   IF switch!
  237.     hold|=127
  238.   ELSE
  239.     hold|=0
  240.   ENDIF
  241.   OUT 3,&HB0+channel-1,64,hold|
  242. RETURN
  243. ' ***
  244. > PROCEDURE all.notes.off(channel)
  245.   OUT 3,&HB0+channel-1,123,0
  246. RETURN
  247. ' ***
  248. > PROCEDURE main.volume(channel,volume)
  249.   OUT 3,&HB0,7,volume
  250. RETURN
  251. ' ***
  252. > PROCEDURE omni(channel,switch!)
  253.   ' *** switch for Omni (if on, channel will be ignored)
  254.   IF switch!
  255.     OUT 3,&HB0+channel-1,124,0   ! on
  256.   ELSE
  257.     OUT 3,&HB0+channel-1,125,0   ! off
  258.   ENDIF
  259. RETURN
  260. ' ------------------------------------------------------------------------------
  261. '
  262. > PROCEDURE kawai.k1.exclusive(channel,function,sub1,sub2,VAR data|())
  263.   ' *** send system exclusive data to Kawai K1
  264.   ' *** data in byte-array
  265.   LOCAL last,i
  266.   OUT 3,&HF0,&H40,channel-1,function,&H0,&H3,sub1,sub2
  267.   last=DIM?(data|())-1
  268.   FOR i=0 TO last
  269.     OUT 3,data|(i)
  270.   NEXT i
  271.   OUT 3,&HF7
  272. RETURN
  273. ' **********
  274. '
  275.